package spring.mvc;

import org.springframework.web.context.support.HttpRequestHandlerServlet;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import spring.mvc.config.RootConfig;
import spring.mvc.config.SpringMvcConfig;

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // spring 配置
        return new Class<?>[]{RootConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // spring mvc 配置
        return new Class<?>[]{SpringMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        // DispatcherServlet 拦截路径，/* 拦截所有，/ 会排除 *.jsp 文件
        // 当一个 url 与多个 servlet 的匹配规则可以匹配时，则按照：“精确路径 > 最长路径 > 扩展名” 这样的优先级匹配到对应的 servlet。
        // 所以一般来说我们的 DispatcherServlet 一般都是最后被匹配上的（若有多个 Servlet 匹配的情况下）
        return new String[]{"/"};
    }

    /**
     * 文件上传设置
     * https://www.cnblogs.com/yy3b2007com/p/11783661.html
     * https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-multipart
     * https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/multipart/support/StandardServletMultipartResolver.html
     *
     * @see org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
     */
    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
        // Optionally also set maxFileSize, maxRequestSize, fileSizeThreshold
        registration.setMultipartConfig(new MultipartConfigElement("/tmp"));
    }


    // @Autowired
    // private ServletContext servletContext;
    // 需要注意的是：在 Spring 的 config 里面，是不允许通过 servletContext 再向 web 容器内添加 servlet 的

    // 注册一个 HttpRequestHandlerServlet 来专门处理 client 端的请求
    // 要求：此 servletName 必须是上面对应的 Bean 的 BeanName
    // servletContext.addServlet("helloServiceExporter", new HttpRequestHandlerServlet()).addMapping("/helloService");

    @Override
    protected void registerDispatcherServlet(ServletContext servletContext) {
        super.registerDispatcherServlet(servletContext);
        // 关于远程调用
        // 注册我们自己的 Servlet 因为这个 servlet 在 jar 包里面，所以这里只能通过编程的方式注册
        // 保证这个 servlet 的名字和 BeanName 相同，helloServiceExporter 为 Bean 的名字
        servletContext.addServlet("helloServiceExporter", new HttpRequestHandlerServlet())
                .addMapping("/rmi_helloService");
    }
}
